;****************************************************************************** ; ; Name: rs1vwf.658 ; ; Group: Translation ; ; Revision: 1.04 ; ; Date: 28/12/4 ; ; Author: Frank Hughes [fh512 'at' yahoo 'dot' co 'dot' uk] ; ;****************************************************************************** ; ; Module Functional Description: ; ; This module contains Variable Width Font routines for ; the Romancing Sa.Ga Translation. ; It is written to support RS1's complex window setup - which can ; either of two windows, and can have different numbers of bitplanes, ; positions, sizes and fonts. ; It was also written with the highest optimisation I could achieve (and the ; 65816 does allow high optimisation - TnkU Mr Mensch! :D ) to squeeze ; best performance out of the 2.68Mhz CPU speed, and avoid lags which can cause ; user delays and crashes (as in the BLagoon real snes crash). ; It decides on one of four tile states, based on the position of the tile ; to be placed, which results in a faster operation; and will utilise hardware ; Multiplication Registers to perform shifts of bitrow data. ; ;****************************************************************************** ; ; Changes: ; ; DATE REVISION DESCRIPTION ; -------- -------- ------------------------------------------------------- ; 28/12/4 1.04 Now working in game. Added conditional inlining to code. ; More support for text events. ; 23/09/4 1.01 Major revamp to support window buffering. ; 20/03/4 1.00 Original ; ;****************************************************************************** ; ; INCLUDE Files. ; ; ; PUBLIC Declarations ; ; ; EXTERN Declarations ; ; EQUATES __VWF_INLINE EQU 1 ; Inline Enable = 1. ;****************************************************************************** ; ; Routine Functional Description ; Map Adjustments ; ; ; ; ; ; Registers on Entry: ; ; ; ; Registers on Exit: ; ; ; ;****************************************************************************** Rs1eMap_nop PROC Near,MX:%10,D:RS1E_DPAGE rts ENDP Rs1eMap_nop Rs1eMap_Add PROC Near,MX:%10,D:RS1E_DPAGE ; --- Map Number. php rep #$31 phy ; Preserve Y Index. ; --- Generate Index for Map. lda Rs1e.VWF.mapBuffIndx ; adc Rs1e.VWF.mapBuffBase ; This contains the base screen address. tay ; Pass to Y. ; --- Generate Map Data. lda RS1_MAPATTRIB-1 and #$fc00 ; Mask to leave attib byte in AH. ora Rs1e.VWF.currTil ; Merge with current tile. ; --- Tile Type ldx Rs1e.VWF.tilDimType ; Load X with Tile Dimension Type. ; --- Process Map based on the tile dimension. jsr (fnTab_VMapDim,x) ; Call to add data to Map. ; --- Adjust to next tile in the buffer. lda Rs1e.VWF.tilBuffIndx adc Rs1e.VWF.WtileSz sta Rs1e.VWF.tilBuffIndx ply ; Restore Y Index. ; ------ plp rts ; Return. ENDP Rs1eMap_Add fnTab_MPlace ; Merge. DW Rs1eMap_nop & $ffff DW Rs1eMap_Add & $ffff DW Rs1eMap_nop & $ffff ; Store. DW Rs1eMap_nop & $ffff DW Rs1eMap_Add & $ffff DW Rs1eMap_nop & $ffff ; Whitespace. DW Rs1eMap_nop & $ffff DW Rs1eMap_Add & $ffff DW Rs1eMap_nop & $ffff fnTab_VMapDim PROC Near DW fnMapDim_8_16 & $ffff ; 8*16 Tile (2-bitplane). DW fnMapDim_8_16 & $ffff ; 8*16 Tile (4-bitplane). ENDP fnTab_VMapDim fnMapDim_8_8 PROC Near,MX:%00,D:RS1E_DPAGE ; Not sure about this - check the include file. ; 8*8 Tile Horz adjust. ;00a54e b9 07 16 LDA $1607,Y ; Adjust W1HorzCharCount by 2. ;00a551 1a INC ; ... ;00a552 99 07 16 STA $1607,Y ; ... ;00a569 b9 0f 16 LDA $160f,Y ; Load YCount ;00a56c d9 06 16 CMP $1606,Y ; Compare to YMax ;00a56f b0 05 BCS $a576 ; Branch over adjustment if greater than?! ;00a571 1a INC ; Adjust by 2. ;00a572 1a INC ;00a573 99 0f 16 STA $160f,Y ; Update ;00a576 b9 07 16 LDA $1607,Y ; Load W1HorzCharCount. ; --- Update Map Buffer. inc Rs1e.VWF.mapBuffIndx inc Rs1e.VWF.mapBuffIndx tyx inc Rs1e.VWF.currTil ; Increment to next tile number. sta >MAPBUFF_BASE+RS1_MAP_R2,x ; Store in the Map Buffer. ; --- sep #$10 ldx RS1_WINACTV ; Load Active Window setting. lda >ActvW2Rs1WinTab,x ; Active Win to Rs1 Win Index. tax lda $1607,x bra @fmd_join ENDP fnMapDim_8_8 fnMapDim_8_16 PROC Near,MX:%00,D:RS1E_DPAGE ; 16*16 Tile Horz adjust. ;00a544 b9 07 16 LDA $1607,Y ;00a547 1a INC ;00a548 1a INC ;00a549 99 07 16 STA $1607,Y ;00a555 d9 05 16 CMP $1605,Y ; Compare to W1HorzCharMax ;00a558 90 1c BCC $a576 ; Branch if less than. ;00a55a a9 00 LDA #$00 ;00a55c 99 07 16 STA $1607,Y ; Zero W1HorzCharCount. ;00a55f b9 08 16 LDA $1608,Y ; Load W1VertRowCount. ;00a562 1a INC ; Adjust by 2. ;00a563 1a INC ;00a564 29 3f AND #$3f ; Mask within 64 range. ;00a566 99 08 16 STA $1608,Y ; Update W1VertRowCount. ; Not sure about this - check the include file. ;00a569 b9 0f 16 LDA $160f,Y ; Load YCount ;00a56c d9 06 16 CMP $1606,Y ; Compare to YMax ;00a56f b0 05 BCS $a576 ; Branch over adjustment if greater than?! ;00a571 1a INC ; Adjust by 2. ;00a572 1a INC ;00a573 99 0f 16 STA $160f,Y ; Update ;00a576 b9 07 16 LDA $1607,Y ; Load W1HorzCharCount. ;00a579 60 RTS ; Return. ; --- Update Map Buffer. inc Rs1e.VWF.mapBuffIndx inc Rs1e.VWF.mapBuffIndx tyx inc Rs1e.VWF.currTil ; Increment to next tile number. inc Rs1e.VWF.currTil ; Increment to next tile number. sta >MAPBUFF_BASE+RS1_MAP_R1,x ; Store in the Map Buffer. inc a ; Increment Map Number. sta >MAPBUFF_BASE+RS1_MAP_R2,x ; Store in the Map Buffer. ;--- sep #$30 ldx RS1_WINACTV ; Load Active Window setting. lda >ActvW2Rs1WinTab,x ; Active Win to Rs1 Win Index. tax lda $1607,x ; Load W1HorzCharCount. @fmd_join ; Join for other Map handling routines. inc a ; ... sta $1607,x ; Update W1HorzCharCount.. cmp $1605,x ; Compare to W1HorzCharMax bcc @fmd8_16_1 stz $1607,x ; Zero W1HorzCharCount. beq @fmd8_16_1 lda $1608,x ; Load W1VertRowCount. inc a ; Adjust by 2. inc a ; ... and #$3f ; Mask within 64 range. sta $1608,x lda $160f,x cmp $1606,x bcs @fmd8_16_1 inc a inc a sta $160f,x @fmd8_16_1 lda $1607,x ; Update W1VertRowCount. rep #$31 stz Rs1e.VWF.indxTilR ; Flag that tile has been updated. rts ; Return. ENDP fnMapDim_8_16 ;00a569 b9 0f 16 LDA $160f,Y ; Load YCount ;00a56c d9 06 16 CMP $1606,Y ; Compare to YMax ;00a56f b0 05 BCS $a576 ; Branch over adjustment if greater than?! ;00a571 1a INC ; Adjust by 2. ;00a572 1a INC ;00a573 99 0f 16 STA $160f,Y ; Update ;00a576 b9 07 16 LDA $1607,Y ; Load W1HorzCharCount. ;****************************************************************************** ; ; Routine Functional Description ; ; TransVWFRowOffsetMake() ; Make Row Offset. ; ; ; ; Registers on Entry: ; A8 : Character number. ; ; ; Registers on Exit: ; Status.M : 8-bit. ; Status.X : 8-bit. ; ; ; DW ; Shift+Merge ; DW ; Shift+Store ; DW ; ; ;****************************************************************************** TransVWFRowOffsetMake PROC Near,MX:%10,D:RS1E_DPAGE,DB:^RS1E_KERNELDATA ; --- Make Index to Character Width. sep #$20 pha rep #$21 and #$00ff ; Mask off extraneous data. adc Rs1e.VWF.chrLenTabPtr tax ; --- Make Tile Buffer Indexes. lda Rs1e.VWF.tilBuffIndx sta Rs1e.VWF.indxTilL adc Rs1e.VWF.WtileSz sta Rs1e.VWF.indxTilR ; --- Fetch Character Width. lda RS1E_CHRLENTAB_BASE,x sep #$30 ; MX to 8-bit. (leave it here!! :p ) sta Rs1e.VWF.chrWidth lda Rs1e.VWF.pixPos ; Load accum with Current Pixel Position. plx cpx #$BB ; <--- WILL HAVE TO CHECK THIS. clc beq @rom_wSpace ldx #MERGE8_BASE ; MERGE Dual Tile status and #%00000111 ; Mask 0~7 pixel position within a tile. bne @pPosNotZero ; --- Tile Offset is on edge of tile. ldx #STORE8_BASE ; STORE Dual Tile status. @pPosNotZero ; --- Work out width over tile. ; |<--------- Pixel Length for 16*16 Tile ------->| adc Rs1e.VWF.chrWidth ; Combine with current tile length. eor #$ff ; 1's Complement. adc #16+1 ; (2's Complement) 16-chrWidth-pixOffset 'k? =D cmp #8 ; check if it's crossed a tile width. bcc @tilCrssOvr ; Branch tile crossover ; --- Within 8-pixel. beq @til8_noShift ; --- Til8ShiftStore inx ; SHIFT_8 (code with post increment this). ; --- Tile Crosses the pixel offset: adjust row address. @tilCrssOvr inx ; SHIFT_16 status. ;--- Generate Shift Value. @til8_noShift phx ; Preserve 'Place Tile Type'. tax ; lda vwf.widthShiftTab-1,x ; Fetch mplier to shift bitrow. sta Rs1e.VWF.WidthShiftValue ; Store here. pla ; Restore 'Place Tile Type' to accum. asl a ; Adjust for word access. tax ; Transfer back to X index. rts ; Return. @rom_wSpace ldx #WSPACE_BASE and #%00000111 bra @pPosNotZero vwf.widthShiftTab DB %00000010 ; Shift by 1 DB %00000100 ; Shift by 2 DB %00001000 ; Shift by 3 DB %00010000 ; Shift by 4 DB %00100000 ; Shift by 5 DB %01000000 ; Shift by 6 DB %10000000 ; Shift by 7 DB %00000000 ; Dummy Data. ; Duplicate Table to help optimisation (referred when width >8 pixels). DB %00000010 ; Shift by 1 DB %00000100 ; Shift by 2 DB %00001000 ; Shift by 3 DB %00010000 ; Shift by 4 DB %00100000 ; Shift by 5 DB %01000000 ; Shift by 6 DB %10000000 ; Shift by 7 ENDP TransVWFRowOffsetMake ;****************************************************************************** ; ; Routine Functional Description ; ; VWFResetPositions() ; Reset VWF variables and Line Buffer. ; ; ; ; Registers on Entry: ; ; ; ; Registers on Exit: ; Status.M : 16-bit ; Status.X : 16-bit ; A16 : #$ffff ; X16 : Modified ; Y16 : Modified ; ;****************************************************************************** VWFResetPositions PROC Near,D:RS1E_DPAGE,DB:^RS1E_KERNELDATA LongA OFF lda #00 ; Load Accum with 0. sta >Rs1e.VWF.tilBuff ; Clear the base of out Tile Buffer. stz Rs1e.VWF.pixPos ; Reset Pixel Position. rep #$30 ; Index and Accum to 16-bit. stz Rs1e.VWF.tilBuffIndx ; Reset Tile Buffer Index. ; --- Purge Current Row Size. ldx #Rs1e.VWF.tilBuff&$FFFF ; Load X with low word of Source Address. ldy #(Rs1e.VWF.tilBuff+1)&$FFFF ; Load Y with low word of Destination Address. lda Rs1e.VWF.currRowSz ; Load Current Size of Row Buffer. dec a ; Adjust by 1 for block move count. dec a ; Discard initial purge address. mvn Rs1e.VWF.tilBuff,Rs1e.VWF.tilBuff ; Block Move Neg (note: no need to preserve DB). ; --- rts ; Return. ;@rp_noPurge rep #$30 rts ENDP VWFResetPositions ;****************************************************************************** ; ; Routine Functional Description ; ; VWFDisable() ; Disable the Variable Width Font environment. ; ; ; ; Registers on Entry: ; ; ; ; Registers on Exit: ; ; ; ;****************************************************************************** VWFDisable PROC Far,MX:%10,D:$1200 pha stz Rs1e.VWF.enabFlg pla rtl ENDP VWFDisable ;****************************************************************************** ; ; Routine Functional Description ; ; VWFEnable() ; Enable the Variable Width Font environment. ; bit7 = 1 : VWF Tile xfr. ; bit6 = 1 : VWF Enab ; bit0 = 0 : Purge VWF Buff ; bit7 = 1 && bit bit0 =1 : Swap window parms. ; ; ; ; Registers on Entry: ; Status_C : Defines whether VWF is enabled. ; ; ; Registers on Exit: ; ; ; ;****************************************************************************** Rs1eVWF_Setup PROC Near,MX:%10,D:$1200 bcc @vwfe_1 pha lda #%11111110 ; bit7:(VWF Til xfr)bit6:1 (VWF Enab). bit1:0 (Purge VWF Buff) sta Rs1e.VWF.enabFlg CALL VWFInit pla rts @vwfe_1 stz Rs1e.VWF.enabFlg rts ENDP VWFEnable ;****************************************************************************** ; ; Routine Functional Description ; ; VWFInit() ; Initialise the Variable Width Font environment. ; ; ; ; Registers on Entry: ; ; ; ; Registers on Exit: ; ; ; ;****************************************************************************** VWFInit PROC Near,MX:%10 PUSHA ; Preserve Assember Assumes. php ; Preserve Status Flags. rep #$30 ; Accum to 16-bit. pha ; Preserve A16. phx ; Preserve X16. phy ; Preserve Y16. phd ; Preserve Direct Page. phb ; Preserve Data Bank. ; --- pea RS1E_DPAGE ; Push Trans' DPage onto stack. pld ; Pass to DP. ASSUME D:RS1E_DPAGE pea ^RS1E_KERNELDATA<<8 plb ; Discard. plb ; Pass to PB. ASSUME DB:^RS1E_KERNELDATA ; --- stz Rs1e.VWF.tilBuffIndx ; Reset Tile Buffer Index. sep #$31 ; Accum 8, and C:1 (no window swap). CALL VWFBuildParms ; Build Window Parameters. CALL Rs1eVWFInitActivWin ; Initialise CALL VWFResetPositions ; Reset Variable Width Font Positions. plb ; Restore DB. pld ; Restore DP. ply ; Restore Y. plx ; Restore X. pla plp rts ; Return. POPA ; Restore Assembler Assumes. ENDP VWFInit ;----------------------------------------------- bytesPerTile ; *** NUMBER OF BYTES IN A BITPLANE TILE *** DW TILSZ_8_16_2BP DW TILSZ_8_16_4BP DW TILSZ_4BP ; 4-bitplane 8*8 tile. ;----------------------------------------------- vTilAddrBase ; *** VRAM TILE BASE ADDRESSES FOR TYPES *** DW RS1_VTIL_SPEECH_2BP_BASE ; 2-bitplane Tile Base. DW RS1_VTIL_SPEECH_4BP_BASE ; 4-bitplane Tile Base. ;-------------------- vMapAddrBase ; *** VRAM MAP BASE ADDRESSES FOR TYPES *** DW RS1_VMAP_SPEECH_2BP_BASE ; 2-bitplane Map Base. DW RS1_VMAP_SPEECH_4BP_BASE ; 4-bitplane Map Base. ;----------------------------------------------- ; -- Use when rs1 window value wants to access rs1e window. vwfWinIndxTab DB 0 DB RS1E_VWFWIN_STRUCTSZ ; -- Use when Window number wants to access rs1 window. ActvW2Rs1WinTab DB 0 DB RS1_WIN_STRUCTSZ ;----------------------------------------------- vwfBplaneIndxTab DB 0 DB 2 ;----------------------------------------------- ; -- Use when rs1e Index wants to access the same rs1 window. WinIndxTab ; *** RS1 WINDOW STRUCTURE ACCESS *** RS1E_VWFWIN_STRUCTSZ_OFFS = RS1E_VWFWIN_STRUCTSZ-2 DW 0 ; Window 1 index. DS RS1E_VWFWIN_STRUCTSZ_OFFS ; **** Code optimsation fix to allow quick access. DW RS1_WIN_STRUCTSZ ; Window 2 index. ; -- Use when rs1e Index wants to access rs1 alternative window. WinAltIndxTab ; *** RS1 WINDOW ALTERNATIVE STRUCTURE ACCESS *** DW RS1_WIN_STRUCTSZ ; Window 1 index. DS RS1E_VWFWIN_STRUCTSZ_OFFS ; **** Code optimsation fix to allow quick access. DW 0 ; Window 2 index. ; -- Use when rs1 Index wants to access rs1e alternative window. Rs1WinIndx2AltRs1eWinIndx DW RS1E_VWFWIN_STRUCTSZ ; Rs1e Window 2 index. DS RS1_WIN_STRUCTSZ-2 ; **** Code optimsation fix to allow quick access. DW 0 ; Rs1e Window 1 index. ;----------------------------------------------- VramMapBuffBase DW $0B48 DS RS1E_VWFWIN_STRUCTSZ-2 DW $1B48 ;----------------------------------------------- vwfChrLenTab DW (ChrLenTab_Dlog-$80) & $FFFF ; Dialogue Font. DW (ChrLenTab_Mnu-$80) & $FFFF ; Menu Font ;----------------------------------------------- FnTab_Rs1eVWFLineUpdate DW Rs1eVWFLineUpdate_Dlogue & $ffff DW Rs1eVWFLineUpdate_Menu & $ffff ;----------------------------------------------- tileBase DW ChrSet_Dlog & $ffff ; Debug until I get a 8*8 2bitplane setting. DW ChrSet_Mnu & $ffff Fn_TabRs1eVWFAlign DW Fn_TabRs1eVWFAlign_Dlogue & $ffff ; Dialogue DW Fn_TabRs1eVWFAlign_Menu & $ffff ; Menu ;----------------------------------------------- ChrSet_Dlog INCBIN "rs1vwf16.dat" ChrSet_Mnu INCBIN "rs1prch.set" ;----------------------------------------------- ChrLenTab_Dlog ; *** DEBUG *** INCBIN "widthout.bin" ChrLenTab_Mnu ; *** DEBUG *** INCBIN "rs1prch.wid" ;----------------------------------------------- ;****************************************************************************** ; ; Routine Functional Description ; ; Tile Adjustments. ; ; ; There's four types of Tile Place: ; 1: shift+merge+store - Tile is moved in position, merged with existing data, stored. ; 2: merge+store - Tile is already in correct pos, merged with exist' dat, store. ; 3: shift+store. - Tile is shifted to the start of a fresh block, stored. ; 4: store - Tile is in 'Fixed-Width-Font' mode. ; ; Registers on Entry: ; ; ; ; Registers on Exit: ; ; ; ;****************************************************************************** fnTab_TPlace PROC Near ;MERGE ;SHIFT_MERGE16 ;SHIFT_MERGE8 ;STORE ;SHIFT_STORE16 ;SHIFT_STORE8 ; Merge DW TPlaceMerge8 & $ffff ; Tile is not left-aligned, but in 8-bit width. DW TPlaceShiftMerge16 & $ffff ; Tile is not left-aligned, and lies between 2 tiles (16 pixels). DW TPlaceShiftMerge8 & $ffff ; Tile is not left-aligned, but shifted within 8-bit width. ; Store DW TPlaceStore8 & $ffff ; Tile is left-aligned and source tile is on the leftmost side. DW TPlaceStore16 & $ffff ; (not used on 8*8 or 8*16 implementation). DW TPlaceShiftStore8 & $ffff ; Tile is left-aligned and shifted within 8-bit width. ; Whitespace DW TPlaceWSpace8 & $ffff ; Null routine. DW TPlaceWSpace16 & $ffff ; Null routine. DW TPlaceWSpaceShift8 & $ffff ; Null routine. ENDP fnTab_TPlace Rs1eAddChr2Map PROC Near,MX:%10,D:RS1_DPAGE PUSHA ; --- Preserve Y. phy ; --- Setup Data Bank. php phb ; Preserve Data Bank. pea ^RS1E_KERNELDATA<<8 ; Push Bank of Trans' data onto stack. plb ; Discard. plb ; Pass to PB. ASSUME DB:^RS1E_KERNELDATA ; --- Setup Direct Page. phd ; Preserve current Direct Page. pea RS1E_DPAGE ; Push Translation DPage loc' onto stack. pld ; Pass it to DP. ASSUME D:RS1E_DPAGE stx Rs1e.VWF.mapBuffIndx ; Store the map Buffer Index. pha ; Preserve Character onto stack. CALL TransVWFRowOffsetMake ; Generate offsets into VWF Row Data. LongI ON pla sbc #$80-1 ; -1, because carry is clear. sta WRMPYA ; Store it in multiplier. lda Rs1e.VWF.WtileSz ; Fetch size of a single Tile for this window. sta WRMPYB ; Store as multiplicand. sta Rs1e.VWF.rowCount ; Store as bitrow counter. stz Rs1e.VWF.rowCount+1 ; Clear top byte of rowCount. ; --- Setup Shift value in multiplier (this will not corrupt the current Product). lda Rs1e.VWF.widthShiftValue ; Load Shift Value. sta WRMPYA ; Store in Multiplier. rep #$31 lda Rs1e.VWF.tilSrcBase ; Base Address of Tile. adc RDMPYL ; Add offset phx jsr (fnTab_TPlace,x) ; Call Table subroutine for Tile Placing. plx @ac_wspace jsr (fnTab_MPlace,x) ; Call Table subroutine for Map Placing. CALL Rs1eAdjustPixPos pld ; Restore direct page. plb ; Restore Data Bank. plp ply ; Restore Y. rts ; Return. POPA ENDP Rs1eAddChr2Map ;****************************************************************************** ; ; Routine Functional Description ; ; Rs1eProcChar() ; ; This subroutine decides which way to process the char, depending on the ; VWF enable state and the range of the character. ; ; ; ; ; Registers on Entry: ; A8 :character. ; X16 : Map Buffer Index. ; Status_M : 8-bit. ; Status_X : 16-bit. ; DPage : Unknown ; ; Registers on Exit: ; Status.M ; 16-bit ; Status.X ; 16-bit. ; ; Add 8*8 to Map. ;****************************************************************************** Rs1eProcChar PROC Far,MX:%00,D:RS1_DPAGE bit Rs1e.VWF.enabFlg-1 ; Check if the VWF is enabled. bvc @pc_nvwfArea ; Branch if a non-vwf area. sep #$20 stx Rs1e.VWF.mapBuffIndx ; Store Map Buffer Index. cmp #RS1E_CHRRANGE_NONVWF ; Check if in our range of non-vwf chars. bcc @pc_nvwfChar ; Branch if a non vwf character. ; --- VWF Char. plx ; Discard X from rs1 code. cmp #$ff bne @he_2 lda #$bb @he_2 CALL Rs1eAddChr2Map ; VWF char: add rep #$10 sep #$20 jml $00A579 ; Hook back into rs1 code. ; --- Non-VWF Char. @pc_nvwfChar ; Carry clear on branch. ; ****************** QUESTION: HOW TO I UPDATE A PIXEL OFFSET FROM THIS?? ; *** MAYBE ADD A DEFAULT 8 PIXELS TO PIXPOS HERE?? ; *** ALSO, FOR REALIGNMAPNUM, IF SHIFTED - DO I INCREASE THE RS1'S MAP NUMBER?? (I guess at 'yes'). pha phd pea RS1E_DPAGE pld PUSHA ASSUME D:RS1E_DPAGE CALL Rs1eAlignMapNum pld pla POPA rep #$20 ; **** DEBUG **** ; --- Non-VWF Area. @pc_nvwfArea LongA ON and #$00ff ; Overwritten Game code. asl a ; ... jml $00a4e0 ; Return to Rs1's place char into Map code. ENDP Rs1eProcChar ;****************************************************************************** ; ; Routine Functional Description ; ; Pixel Position Adjustments ; ; ; ; ; Registers on Entry: ; ; ; ; Registers on Exit: ; ; ; ;****************************************************************************** Rs1eAdjustPixPos PROC Near,D:RS1E_DPAGE sep #$20 clc lda Rs1e.VWF.pixPos adc Rs1e.VWF.chrWidth ; A 'charspace' addition operation can go in here. sta Rs1e.VWF.pixPos rts ENDP Rs1eAdjustPixPos ; ******************* I'VE GOTTA BE CAREFUL OF REGISTER PRESERVATION AND MX SIZINGS ********************* Rs1eAlignMapNum PROC Near,MX:%10,D:RS1E_DPAGE lda Rs1e.VWF.pixPos ; Fetch pixel position. and #$07 ; Mask to leave 0~7 pixel area in tile. beq @amn_NoAdj ; Branch if no adjustment needed. ; --- Realign pixel pos. eor #$07 sec ; '+1' adc Rs1e.VWF.pixPos ; Add to pixel Position. sta Rs1e.VWF.pixPos ; Update Pixel Position. ; --- Realign Current map number. CALL Rs1eMap_Add ; Add Map data @amn_NoAdj rts ; Return. ENDP Rs1eAlignMapNum Rs1eVWFUpdateTileLine PROC Far,MX:%10 ldx $16c9 ; Game Code stx $2116 ; Game Code. ; --- Check if VWF Enabled. lda Rs1e.VWF.enabFlg bit Rs1e.VWF.enabFlg ; bit6 0: VWF on/off. bit7=0: VWF Line refresh ( bvc @noVWFEnab ; --- Check if Tile Xfer Flag enabled. bmi @noTileXfr ; **** WOAH, DEBUG THIS PART, AS I'VE CHANGED THE WHOLE WAY THIS WORKS! **** lda Rs1e.VWF.enabFlg cmp #$7f bne @noTileXfr ldx Rs1e.VWF.tilBuffIndx beq @emptyBuffer ; **************************************************************************** lda #$80 sta $420b ; --- Setup VRAM Tile Position. ldx Rs1e.VWF.currVTilPos stx VMADDL ; --- Setup B-Addr and Parameters. ldx #$1800+DMAPRM_2A stx $4370 ; --- Setup A-Addr. ldx #Rs1e.VWF.tilBuff & $FFFF stx $4372 lda #Rs1e.VWF.tilBuff >>16 sta $4374 ; --- Setup Byte Xfer Count. ldx Rs1e.VWF.currRowSz stx $4375 @emptyBuffer rol Rs1e.VWF.enabFlg ; Restore enable flag. @noVWFEnab @noTileXfr rtl ENDP Rs1eVWFUpdateTileLine ;****************************************************************************** ; ; Routine Functional Description ; ; End of Window Adjustments. ; ; ; ; ; Registers on Entry: ; ; ; ; Registers on Exit: ; ; ; ;****************************************************************************** Rs1eVWFEV2e_Refresh PROC Far,D:$1200,DB:$00,MX:%10 pea $c5b8-1 bra rs1e_ev3cJoin ENDP Rs1eVWFEV2e_Refresh Rs1eVWF_HookEv3c PROC Far,MX:%10,D:RS1_DPAGE,DB:$00 plx ; ** Game Code ** pea $b994-1 ; Return address. bra rs1e_ev3cJoin ENDP Rs1eVWF_HookEv3c ; --- TxtCmd $12 (Oneshot). ;00c634 fa PLX ;00c635 da PHX ;00c636 5a PHY ;00c637 20 34 a3 JSR $a334 ; VRAM Map Update ;00c63a ad 0f 12 LDA $120f ; ;00c63d d0 0c BNE $c64b ;00c63f b9 00 16 LDA $1600,Y ;00c642 c9 01 CMP #$01 ;00c644 d0 05 BNE $c64b ;00c646 a9 ff LDA #$ff ;00c648 99 00 16 STA $1600,Y ;00c64b 20 f1 dc JSR $dcf1 ; ;00c64e 7a PLY ;00c64f fa PLX ;00c650 b9 00 16 LDA $1600,Y ;00c653 c9 ff CMP #$ff ;00c655 d0 0c BNE $c663 ;00c657 a9 01 LDA #$01 ;00c659 99 00 16 STA $1600,Y ;00c65c da PHX ;00c65d 5a PHY ;00c65e 20 40 9a JSR $9a40 ; ;00c661 7a PLY ;00c662 fa PLX ;00c663 4c d2 a0 JMP $a0d2 ; ; IF 0 Rs1eVWF_HookOneShot PROC Far,MX:%10,D:RS1_DPAGE,DB:$00 phy ; Game Code. pea $c63a-1 ; Adjusted return address onto stack. rs1e_ev3cJoin bit Rs1e.VWF.enabFlg bpl @os_1 lda Rs1e.VWF.pixPos beq @os_1 phd pea RS1E_DPAGE pld phb pea ^RS1E_KERNELDATA<<8 plb ; Discard. plb ; Pass to PB. ASSUME DB:^RS1E_KERNELDATA phx ASSUME D:RS1E_DPAGE LongA OFF CALL Rs1eMap_Add sep #$20 lsr Rs1e.VWF.enabFlg ; Bit7:0 Denotes a tile Buffer send. stz Rs1e.VWF.pixPos ; *** DEBUG *** plx plb pld @os_1 jml >$00a334 ; Jump to game code. ENDP Rs1eVWF_HookOneShot ;****************************************************************************** ; ; Routine Functional Description ; ; End of Window Adjustments. ; ; ; ; ; Registers on Entry: ; ; ; ; Registers on Exit: ; ; ; ;****************************************************************************** Rs1eVWF_HookEow PROC Far,MX:%10,D:RS1_DPAGE,DB:$00 bit Rs1e.VWF.enabFlg bpl @he_1 cpx #$0000 bne @he_1 lda Rs1e.VWF.pixPos beq @he_1 phd pea RS1E_DPAGE pld phb pea ^RS1E_KERNELDATA<<8 plb ; Discard. plb ; Pass to PB. ASSUME DB:^RS1E_KERNELDATA phx ASSUME D:RS1E_DPAGE LongA OFF ldx Rs1e.VWF.tilDimType ; Load X with Tile Dimension Type. CALL Rs1eMap_Add sep #$20 lsr Rs1e.VWF.enabFlg ; Bit7:0 Denotes a tile Buffer send. plx plb pld @he_1 pea $a0da-1 ; Adjusted return address onto stack. jml >$00a334 ; Jump to game code. ;****************************************************************************** ; ; Routine Functional Description ; ; Window Updates ; ; ; ; ; Registers on Entry: ; ; ; ; Registers on Exit: ; ; ; ;****************************************************************************** Rs1eVWFEolUpdate PROC Far,D:$1200,MX:%10 PUSHA phb ; Preserve current Data Bank. pea ^RS1E_KERNELDATA<<8 ; Push Trans' bank onto stack. plb ; Discard. plb ; Pass to Data Bank. ASSUME DB:^RS1E_KERNELDATA phd ; Preserve current Direct Page. pea RS1E_DPAGE ; Push Trans' Direct Page onto stack. pld ; Pass to Direct Page. ASSUME D:RS1E_DPAGE phx ; Preserve X. phy ; Preserve Y. php ldx Rs1e.VWF.tilBuffIndx ; Set ZFlag. sep #$10 bcs @eu_1 ; Branch if no window swap. CALL VWFBuildParms CALL Rs1eVWFInitActivWin sep #$20 CALL VWFResetPositions ; Reset Variable Width Font Positions. bra @eu_2 @eu_1 ; --- Tile Type php ldx Rs1e.VWF.tilDimType ; Load X with Tile Dimension Type. jsr (FnTab_Rs1eVWFLineUpdate,x) plp beq @eu_2 CALL VWFResetPositions ; Reset Variable Width Font Positions. @eu_2 plp ply plx pld plb rtl POPA ENDP Rs1eVWFEolUpdate Rs1eVWFLineUpdate_Dlogue PROC Near,MX:%11,D:RS1E_DPAGE,DB:^RS1E_KERNELDATA ; --- Check for Window+Buffer wraparound. ; Tiles should be wrapped for full win length and y+1 size. ldx Rs1e.VWF.winIndx inc Rs1e.VWF.YBuffCounter ; <--- This may be moved outside of routine. lda Rs1e.VWF.YBuffCounter cmp Rs1e.VWF.Win.YRowTiles,x bcc @lud_1 tdc ; Speed hack for 'lda #$00'. @lud_1 sta Rs1e.VWF.YBuffCounter ; Reset YBuffer Counter. ; --- Generate VRAM Offset. ; ((TBuffSz/2)*(YBuffCounter)+VramBase. rep #$20 lda Rs1e.VWF.Win.RowSz,x lsr a sep #$20 sta M7A xba sta M7A lda Rs1e.VWF.YBuffCounter sta M7B rep #$21 lda Rs1e.VWF.Win.VTilPos,x adc MPYL sta Rs1e.VWF.currVTilPos ; --- Generate Tile Offset. ; --- (XLen*YBuffCounter)+TNumBase sep #$20 lda Rs1e.VWF.YBuffCounter lud_align_hook1 ; I need to keep this here with so many rep/seps, due to this hookup. sta WRMPYA lda Rs1e.VWF.Win.xTiles,x ; asl a sta WRMPYB rep #$20 ; [3 cycs] lda Rs1e.VWF.Win.TilNumBase,x ; [5 cycs] adc RDMPYL ; [3 decode cycs] sta Rs1e.VWF.currTil sep #$20 ; Accum back to 8-bit. rts Fn_TabRs1eVWFAlign_Dlogue ldx Rs1e.VWF.winIndx lda $1608,y lsr a jsr lud_align_hook1 lda Rs1e.VWF.WtileSz sta WRMPYA lda $3,s sta WRMPYB ;-- rep #$21 and #$00ff asl a adc Rs1e.VWF.currTil sta Rs1e.VWF.currTil lda RDMPYL sta Rs1e.VWF.TilBuffIndx sep #$20 rts Fn_TabRs1eVWFAlign_Menu rts ENDP Rs1eVWFLineUpdate_2bp Rs1eVWFLineUpdate_Menu PROC Near,MX:%11,D:RS1E_DPAGE,DB:^RS1E_KERNELDATA rep #$21 lda Rs1e.VWF.tilBuffIndx ; Load accumulator with Tile Buffer Index. beq @lum_1 ; Branch if no Tiles where added. ; --- Calculate new tile number. lsr a ; Divide Tile Buffer Index by 2 for VRAM addressing. (2Cycs) adc Rs1e.VWF.currVTilPos ; Add to current VRAM Tile Position. (4Cycs) sta Rs1e.VWF.currVTilPos ; Update current VRAM Tile Position. (4Cycs) @lum_1 sep #$20 rts ENDP Rs1eVWFLineUpdate_Menu Rs1eVRAMMapUpdate2 sec bra @rs1eVRAMMapUpdate2_link Rs1eVRAMMapUpdate PROC Far,MX:%10,D:RS1_DPAGE pea eh_3-1 ; Return address in EOL Handler. @rs1eVRAMMapUpdate2_link pha php bit Rs1e.VWF.enabFlg ; Check bit6 (VWF Enab status). bpl nlh_1 ; Branch out if VWF is not enabled. rep #$20 ; darn....... lda Rs1e.VWF.indxTilR ; Check if this has been zeroed by the tile placer. sep #$20 bne nlh_e ; Branch if no (needs tile updating). lda Rs1e.VWF.pixPos ; Check for possibility we have residual 16-bit tile. and #$07 ; check if it currently lies within a font. beq nlh_1 nlh_e phy ; Preserve Y. phd ; Preserve Direct Page. pea RS1E_DPAGE ; Rs1e Direct Page. pld ; Pass to DP. phx ; Preserve X. ASSUME D:RS1E_DPAGE ; Set Assembler assume for the direct page. CALL Rs1eMap_Add ; Add character to map. sep #$20 ; Accum back to 8-bit. plx ; Restore X. pld ; Restore direct Page. ply nlh_1 plp bcc nlh_2 ; branch if no window swap. pla jml >$00c744 ; Jump into Rs1 Subroutine. nlh_2 pla sta $2,s ; Heh! :P pla ; Discard return address. pla jml >eh_4 ; Return to game code. ENDP Rs1eVRAMMapUpdate ;****************************************************************************** ; ; Routine Functional Description ; ; Window Type Adjustments. ; ; ; ; ; Registers on Entry: ; ; ; ; Registers on Exit: ; ; ; ;****************************************************************************** ; TxtCmd $13 < ;00c666 fa PLX ;00c667 20 44 c7 JSR $c744 ; Window Manipulation. ;00c66a 20 34 a3 JSR $a334 ; VRAM Map UpdateUpdate VRAM map data. ;00c66d a9 01 LDA #$01 ;00c66f 85 8e STA $8e ;00c671 20 6b a1 JSR $a16b ; Fetch Byte from Block Stream. ;00c674 85 82 STA $82 ; Store here. ;00c676 a5 8c LDA $8c ; Active Speech Window. ;00c678 da PHX ;00c679 20 6d 98 JSR $986d ; Close Active Window ;00c67c fa PLX ;00c67d 4c d2 a0 JMP $a0d2 ; Rs1eVWF_WTypeHandler_Hook PROC Far,D:RS1_DPAGE,MX:%10 ; --- Perform overwritten game code plx ; Game Code: Restore X. ; --- Check if VWF Enabled. bit Rs1e.VWF.enabFlg ; Check if VWF Enabled. bvc @wth_1 ; Branch if no. ; --- Build Window Parameters. phb ; Preserve current Data Bank. pea ^RS1E_KERNELDATA<<8 ; Push Trans' bank onto stack. plb ; Discard. plb ; Pass to Data Bank. phd ; Preserve current Direct Page. pea RS1E_DPAGE ; Push Trans' Direct Page onto stack. pld ; Pass to Direct Page. phx ; Preserve X. phy ; Preserve Y. clc ; <--- see if this can be removed. ASSUME D:RS1E_DPAGE,DB:^RS1E_KERNELDATA CALL VWFBuildParms ; Build Parameters for active window. ; --- Initialise Active Window. CALL Rs1eVWFInitActivWin ; Refresh Active Window parameters. rep #$10 ; Index to 16-bit. ply ; Restore Y. plx ; Restore X. pld ; Restore Direct Page. plb ; Restore Data Bank. ; --- Return to game code @wth_1 jml >$00a0d2 ; Jump back into Game Code. ENDP Rs1eVWFWTypeHandler ;****************************************************************************** ; ; Routine Functional Description ; ; VWFBuildParms() ; Build Parameters for Variable Width Font. ; ; ; ; Registers on Entry: ; Y:8 Window Select. (0=win1;1=win2) (assume 1 if there are 2 ; active windows. ; Status.C: Window Select. (0=win1;1=win2) ; ; Registers on Exit: ; Status.V: Request for another window build (if matching types). ; Status.M: 8-bit. ; Status.X: 8-bit. ; ; ;****************************************************************************** RS1E_MENU_TILNUM_BASE EQU 64+1 ; 64+1whitespace. RS1E_SPEECH_TILNUM_BASE EQU 1 ; 1whitespace VWFBuildParms PROC Near,D:RS1E_DPAGE,DB:^RS1E_KERNELDATA LongI OFF phx ; Preserve X phy ; Preserve Y php ; Preserve Status Flags. ; --- Setup indexes to data. sep #$30 ldx #0000 ; Rs1e Win1 Structure access. lda RS1_WINACTV beq @bp_win1 ; Branch if window 1. ldx #RS1E_VWFWIN_STRUCTSZ ; Rs1e Win2 Structure access. @bp_win1 CALL Rs1eVWFChkDualWinActv ; Check for dual window active. rep #$10 bne @bp_dualWin ; Branch if dual window bmi @bp_singleWin2Dlogue ; Branch if Window 2. bvc @bp_singleWin1Dlogue ; Branch if not a menu. ; === Menu. @bp_singleWinMenu @bp_dualWinMenu ; ------ Set Tile Number Base. ldy #RS1E_MENU_TILNUM_BASE sty Rs1e.VWF.Win.TilNumBase,x ; ------ Set VRAMBase to $0400. ldy #RS1_VTIL_SPEECH_4BP_BASE ; ------ Set TileType to 4-Bitplane. lda #TILDIM_8_16_4BP bra @bp_join ; === Dialogue ; ------ Single Win. @bp_singleWin1Dlogue @bp_singleWin2Dlogue ldy #RS1E_SPEECH_TILNUM_BASE sty Rs1e.VWF.Win.TilNumBase,x ; ------ Set VRAMBase. ldy #RS1_VTIL_SPEECH_2BP_BASE ; ------ Set TileBase. bra @bp_join_2bp ; === Dual Window Active. @bp_dualWin bvc @bp_dualWinMenu ; Branch if a menu. ; --- Dual Win - 2Blane. @bp_dualWinBPlane2 ; ------ Calculate VRAMBase. CALL Bp_CalcDualWinOffs ; Calculate Dual Window offsets. ; ------ Calculate TileBase. @bp_join_2bp ; ------ Set TileType to 2-Bitplane. lda #TILDIM_8_16_2BP @bp_join sty Rs1e.VWF.Win.VTilPos,x sta Rs1e.VWF.Win.tilDimType,x stz Rs1e.VWF.Win.tilDimType+1,x xba ; Temporarily preserve sep #$10 ldy WinIndxTab,x ; Fetch RS1 Structure Index. lda RS1.WIN.WIDTH,y ; Fetch the current window width. ; ------ Setup number of X Tiles. sta Rs1e.VWF.Win.xTiles,x ; Store here. ; --- Generate Number of Tiles in Window. sta WRMPYA lda RS1.WIN.HEIGHT,y ; Fetch the current window height. lsr a inc a ; <<----- Buffer adjustment. sta WRMPYB ; ------ Setup number of Y Tiles. sta Rs1e.VWF.Win.YRowTiles,x ; ;--- Placed here for Mult' latency. xba ; Restore BPlane access index back to accum. tay ; Transfer to Y. ;--- lda RDMPYL ; --- Setup Number of tiles in Active Window. sta Rs1e.VWF.Win.NumTiles,x ; Store here. ; --- Generate the size of a Row of tiles in the Tile Buffer. lda bytesPerTile,Y ; Fetch the number of bytes in a tile. sta WRMPYA sta Rs1e.VWF.Win.WtileSz,x ; Store here. stz Rs1e.VWF.Win.WtileSz+1,x lda Rs1e.VWF.Win.xTiles,x ; Store here. sta WRMPYB rep #$20 ; Accum to 16-bit. ; --- Fetch Source Tile Base. lda tileBase,y sta Rs1e.VWF.Win.tilSrcBase,x ; --- Generate Bitplane Row Size. lda RDMPYL ; Fetch 16-bit product (4/5cycles). (6cycs if long). sta Rs1e.VWF.Win.RowSz,x ; Store in Window Row Size. ; --- Setup Current Row Size (also, so that we can initially purge to this size). sta Rs1e.VWF.currRowSz ; Store here for initial RowBuff purge size. ; -- Setup Tile Base lda Rs1e.VWF.Win.TilNumBase,x sta Rs1e.VWF.currTil ; --- Character Width Pointer. lda vwfChrLenTab,y sta Rs1e.VWF.Win.chrLenTabPtr,x ; --- Exit. plp ; Restore Status Flags. ply ; Restore Y. plx ; Restore X. rts ; Return. ENDP VWFBuildParms Bp_CalcDualWinOffs PROC Near,MX:%10,D:RS1E_DPAGE,DB:^RS1E_KERNELDATA ; -- Generate VRAM Tile Offset. ldy WinAltIndxTab,x lda Rs1e.VWF.Win.RowSz,y sta M7A lda Rs1e.VWF.Win.RowSz+1,y sta M7A lda Rs1e.VWF.Win.YRowTiles,y sta M7B ; -- Generate Map num offset. rep #$21 lda Rs1e.VWF.Win.NumTiles,y and #$00ff asl a adc #$0001 sta Rs1e.VWF.Win.TilNumBase,x ; --- Fetch VRAM Tile Offset. lda MPYL lsr a adc #RS1_VTIL_SPEECH_2BP_BASE tay sep #$20 rts ENDP Bp_CalcDualWinOffs Rs1eVWFChkDualWinActv PROC Near,MX:%11,D:RS1E_DPAGE,DB:^RS1E_KERNELDATA beq @cdw_a lda $1600 bra @cdw_a1 @cdw_a lda $120f bne @cdw_singlWinMenu @cdw_a1 lda $1620 beq @cdw_singleWinDlogue @cdw_Dual bcs @cdw_dualWin2Dlogue cmp #$10 beq @cdw_dualWinMenu @cdw_dualWin2Dlogue ; Z already != 0. rep #%00000011 sep #%01000000 rts @cdw_dualWinMenu rep #%01000011 rts @cdw_singlWinMenu ror a ; Carry Set N Flag (denotes Win1 or 2) sep #%01000011 ; Set Carry Z and overflow rts @cdw_singleWinDlogue ror a ; Carry Set N Flag (denotes Win1 or 2) bpl @singleWin1Dlogue sep #%10000011 ; Set Carry Z and overflow rep #%01000000 rts @singleWin1Dlogue sep #%00000011 rep #%11000000 rts ENDP Rs1eVWFChkDualWinActv ; Dual Win Dlog %0100 0000 ; Dual Win Menu %0000 0000 ; Sing Win Menu %0100 0011 ; Sing Win Dlog %0000 0011 ;****************************************************************************** ; ; Routine Functional Description ; ; Window Initialisations. ; ; ; ; ; Registers on Entry: ; ; ; ; Registers on Exit: ; ; ; ;****************************************************************************** Rs1eVWFInitActivWin PROC Near,D:RS1E_DPAGE,DB:^RS1E_KERNELDATA php stz Rs1e.VWF.YBuffCounter ; --- Setup Active Window. sep #$10 ldy RS1_WINACTV ; Load Active Window setting. rep #$20 ; Accum 16-bit. stz Rs1e.VWF.winIndx ldx vwfWinIndxTab,y ; Active Win to Rs1e Win Index. stx Rs1e.VWF.winIndx ; Store here. ; ** Character Length Table Pointer. ** lda Rs1e.VWF.Win.chrLenTabPtr,x sta Rs1e.VWF.chrLenTabPtr ; ... ; ** Tile Source Base ** lda Rs1e.VWF.Win.tilSrcBase,x sta Rs1e.VWF.tilSrcBase ; ... ; ** VRAM Tile Position. ** lda Rs1e.VWF.Win.VTilPos,x ; ... sta Rs1e.VWF.currVTilPos ; ** Active Window Tiles Size ** lda Rs1e.VWF.Win.WtileSz,x sta Rs1e.VWF.WtileSz ; ... ; ** Map Buffer Base ** lda #$0b48 sta Rs1e.VWF.mapBuffBase ; ... ; ** Active Tile Dimension Type (16-bit width for optimisation) ** lda Rs1e.VWF.Win.tilDimType,x sta Rs1e.VWF.tilDimType ; ... ; --- Return. sep #$20 ; Accum 8-bit. plp rts ; Return. ENDP Rs1e.VWF.InitActivWin Rs1eVWFTileAlign_Hook PROC Far,MX:%10,D:RS1_DPAGE bit Rs1e.VWF.enabFlg ; Check if variable width font bvc @tah_1 ; Branch if VWF is not enabled. ; --- Align font. phx ; Preserve X16. phy ; Preserve Y16. phd ; Preserve Direct Page. phb ; Preserve Data Bank. ; --- pea RS1E_DPAGE ; Push Trans' DPage onto stack. pld ; Pass to DP. ASSUME D:RS1E_DPAGE pea ^RS1E_KERNELDATA<<8 plb ; Discard. plb ; Pass to PB. ASSUME DB:^RS1E_KERNELDATA php pha ; Push tile offset on stack. CALL Rs1eAlignMapNum sep #$20 ; --- Generate new Pixel Position. clc lda $1,s ; Load tile offset into accum. adc $129a pha and #$1f ; Mask to leave 0~31 range. ; ** Multiply by 8 to convert tile to pixel. asl a ; Multiply by 8. asl a ; ... asl a ; ... pha ; Temporarily preserve on the stack. ; ** Extract Pixel bits into tile (bits 7~5). lda $2,s ; Load tile offset back into accum. and #$e0 ; Mask to leave bits 7~5. lsr a ; Shift to bit 0 position. lsr a ; ... lsr a ; ... lsr a ; ... lsr a ; ... ; ** Combine together. adc $1,s ; Add to partial product. sta Rs1e.VWF.pixPos ; Update Pixel Position. pla ; Discard Partial. ; --- Generate new Tile Number (this varies depending on the type of tile??). ; Menu: (no adjustment - it will sit directly on to next tile). ; Dlogue: (Align to base of line). ldx Rs1e.VWF.tilDimType jsr (Fn_TabRs1eVWFAlign,x) ; --- Restore Registers. pla ; Discard. pla plp plb pld ply plx ; -- Return game code. ASSUME D:$1200 @tah_1 adc $129a sta $1607,y rtl ENDP Rs1eVWFTileAlign_Hook ;------------------------------------ ; TxtCmd $17 ;00b9a9 fa PLX ;00b9aa 20 34 a3 JSR $a334 ; VRAM Map Update ;00b9ad a9 00 LDA #$00 ;00b9af 8d 72 16 STA $1672 ; ;00b9b2 99 14 16 STA $1614,Y ;00b9b5 20 7a ba JSR $ba7a ; Window manipulations. ;00b9b8 4c d2 a0 JMP $a0d2 ; Rs1eVWFTileVRfrsh_Hook PROC Far,MX:%10,D:RS1_DPAGE plx ; Perform Game Code. bit Rs1e.VWF.enabFlg bpl @vh_1 lda Rs1e.VWF.pixPos beq @vh_1 phd pea RS1E_DPAGE pld phb pea ^RS1E_KERNELDATA<<8 plb ; Discard. plb ; Pass to PB. ASSUME DB:^RS1E_KERNELDATA phx ASSUME D:RS1E_DPAGE LongA OFF CALL Rs1eMap_Add sep #$20 lsr Rs1e.VWF.enabFlg ; Bit7:0 Denotes a tile Buffer send. plx plb pld @vh_1 pea $b9ad-1 ; Adjusted return address onto stack. jml >$00a334 ; Jump to game code. ENDP Rs1eVWFTileVRfrsh_Hook Rs1eVWFHlightChk PROC Far,MX:%10,D:$1200,DB:$00 bit Rs1e.VWF.enabFlg ; Check if Variable Width Font is enabled. bvc @hlc_1 ; Branch if 'no'. ; -- 8*8 VWF checks would go here if we have a 8*8 font. phy ; Preserve Y Index. ldy Rs1e.VWF.tilDimType rep #$21 ; Accum to 16 bit and clear carry. txa ; Pass X to accum. adc RS1E_VWF_MAPOFFSETTAB,y tax ; Update index. ply ; Restore Y Index. lda $1,s adc #$15-1 ; Return offset for two identical routines. sta $1,s ; Hee.. Elegant code! =D sep #$20 @hlc_1 lda >$7f0b48,x ; Load accum with top byte of Map Data. rtl ; Return. ENDP Rs1eVWFHlightChk Rs1eVWFHlightChk_2 PROC Far,MX:%00,D:$1200,DB:$00 bit Rs1e.VWF.enabFlg-1 ; Check if Variable Width Font is enabled. bvc @hlc2_1 ; Branch if 'no'. phy ; Preserve Y Index. ldy Rs1e.VWF.tilDimType lda #$bde3-1 sta $3,s lda >$7f0b48,x ; ** Game Code ** and #$03ff cmp RS1E_VWF_NULLMAPVALTAB,y beq @hlc2_2 ply rep #%00000010 ; Set ZFlag = 0. rtl ; Return to game code. @hlc2_2 ply sep #%00000010 ; Set ZFlag = 1. rtl ; Return to game code. @hlc2_1 lda >$7f0b48,x ; ** Game Code ** rtl ; Return. ENDP Rs1eVWFHlightChk_2 Rs1eVWFProcNullChar PROC Far,MX:%10,DB:$00,D:$1200 lda $1298 sta $1296 pla ; Discard $ff from the stack. lda $1607,y ; Load Current XTile. sbc $129a inc a ; Adjust to next tile. CALL >Rs1eVWFTileAlign_Hook ; Call Tile alignment function. jml $00a555 ; Rejoin game code. ENDP Rs1eVWFProcNullChar ;****************************************************************************** ; ; Routine Functional Description ; ; Tile Adjustments. ; ; ; There's four types of Tile Place: ; 1: shift+merge+store - Tile is moved in position, merged with existing data, stored. ; 2: merge+store - Tile is already in correct pos, merged with exist' dat, store. ; 3: shift+store. - Tile is shifted to the start of a fresh block, stored. ; 4: store - Tile is in 'Fixed-Width-Font' mode. ; ; Registers on Entry: ; ; ; ; Registers on Exit: ; ; ; ;****************************************************************************** TPlaceStore16 PROC Near,MX:%10,D:RS1E_DPAGE,DB:^RS1E_KERNELDATA rts ENDP TPlaceStore16 TPlaceShiftMerge8 PROC Near,MX:%10,D:RS1E_DPAGE,DB:^RS1E_KERNELDATA IF __VWF_INLINE=0 tay ; Pass Tile Source Address to Y sep #$20 ; Accum back to 8-bit. lsr Rs1e.VWF.rowCount ; Divide rowcount by 2 (proc' two at a time). ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. @lp1 lda RS1E_TILSRC_BASE,y sta WRMPYB inx lda >Rs1e.VWF.tilBuff-1,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff-1,x ; Update Left-most Tile Data. lda RS1E_TILSRC_BASE+1,y sta WRMPYB inx lda >Rs1e.VWF.tilBuff-1,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff-1,x ; Update Left-most Tile Data. iny iny dec Rs1e.VWF.rowCount ; Decrement out bitrow count. bne @lp1 ; Loop back if not done for all. rts ; Done for all: Return. ELSE PUSHA ; Push assume list. tax ; Pass Tile Source Addess to X. ldy Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. sep #$20 ; Accum to 8-bit. lda Rs1e.VWF.tilDimType ; Load accum with tile dimension type. pea $2070 plb phd pea $4200 pld cmp #$00 bne @sm8_4bp brl @sm8_2bp @sm8_4bp ; shift-merge8_4Bitplane: ASSUME D:$4200,DB:$70 lda >RS1E_TILSRC_BASE+63,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+63,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+63,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+62,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+62,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+62,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+61,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+61,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+61,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+60,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+60,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+60,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+59,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+59,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+59,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+58,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+58,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+58,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+57,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+57,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+57,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+56,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+56,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+56,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+55,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+55,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+55,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+54,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+54,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+54,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+53,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+53,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+53,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+52,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+52,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+52,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+51,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+51,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+51,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+50,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+50,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+50,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+49,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+49,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+49,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+48,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+48,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+48,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+47,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+47,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+47,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+46,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+46,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+46,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+45,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+45,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+45,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+44,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+44,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+44,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+43,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+43,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+43,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+42,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+42,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+42,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+41,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+41,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+41,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+40,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+40,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+40,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+39,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+39,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+39,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+38,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+38,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+38,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+37,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+37,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+37,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+36,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+36,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+36,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+35,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+35,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+35,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+34,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+34,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+34,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+33,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+33,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+33,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+32,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+32,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+32,y ; Update Left-most Tile Data. @sm8_2bp lda >RS1E_TILSRC_BASE+31,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+31,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+31,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+30,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+30,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+30,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+29,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+29,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+29,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+28,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+28,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+28,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+27,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+27,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+27,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+26,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+26,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+26,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+25,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+25,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+25,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+24,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+24,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+24,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+23,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+23,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+23,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+22,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+22,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+22,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+21,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+21,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+21,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+20,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+20,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+20,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+19,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+19,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+19,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+18,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+18,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+18,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+17,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+17,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+17,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+16,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+16,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+16,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+15,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+15,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+15,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+14,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+14,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+14,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+13,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+13,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+13,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+12,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+12,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+12,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+11,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+11,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+11,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+10,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+10,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+10,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+9,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+9,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+9,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+8,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+8,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+8,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+7,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+7,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+7,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+6,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+6,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+6,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+5,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+5,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+5,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+4,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+4,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+4,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+3,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+3,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+3,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+2,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+2,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+2,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+1,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+1,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+1,y ; Update Left-most Tile Data. lda >RS1E_TILSRC_BASE+0,x ; Load Accumulator with a bitrow of Source Tile. sta <WRMPYB ; Store as Multiplicand. lda |Rs1e.VWF.tilBuff+0,y Load Tile Buffer Data. ora >RDMPYL ; Merge Right most tile with shifted bitrow. sta |Rs1e.VWF.tilBuff+0,y ; Update Left-most Tile Data. pld ; Restore RS1E Direct Page. plb ; Restore RS1E Kernel Bank. POPA ; Restore Assume List. rts ; Return. ENDIF ENDP TPlaceShiftMerge8 ; The following is the slowest and worst case scenario of the VWF Tile place!!! TPlaceShiftMerge16 PROC Near,MX:%10,D:RS1E_DPAGE,DB:^RS1E_KERNELDATA IF __VWF_INLINE=0 tay ; Pass Tile Source Address to Y lsr Rs1e.VWF.rowCount ; Divide rowcount by 2 (proc' two at a time). @loop lda |RS1E_TILSRC_BASE,y ; Fetch 2 rows of Bitrow data. sep #$20 ; Pixels set in Bitplane: Accum to 8-bit. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff,x ; Update Right-most Tile Data. xba ; Reveal second bitrow. sta WRMPYB ; Pixels set in Bitrow: Store in S-NES mult' Reg. lda >Rs1e.VWF.tilBuff+1,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+1,x ; Update Right-most Tile Data. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+1,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+1,x ; Update Left-most Tile Data. rep #$20 ; Accum to 16-bit. inc Rs1e.VWF.indxTilL ; Adjust Left-most Tile buffer Index by 2. inc Rs1e.VWF.indxTilL ; ... inc Rs1e.VWF.indxTilR ; Adjust Right-most Tile Buffer Index by 2. inc Rs1e.VWF.indxTilR ; ... iny ; Adjust Tile Index by 2 bitrows. iny ; ... dec Rs1e.VWF.rowCount ; Decrement out bitrow count. bne @loop ; Loop back if not done for all. rts ; Done for all: Return. ELSE PUSHA ; Push assume list. tay ; Pass Tile Source Addess to Y. sep #$20 ; Accum to 8-bit. lda Rs1e.VWF.tilDimType ; Load accum with tile dimension type. bne @sm16_4bp brl @sm16_2bp @sm16_4bp lda |RS1E_TILSRC_BASE+63,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+63,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+63,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+63,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+63,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+62,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+62,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+62,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+62,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+62,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+61,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+61,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+61,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+61,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+61,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+60,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+60,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+60,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+60,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+60,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+59,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+59,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+59,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+59,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+59,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+58,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+58,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+58,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+58,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+58,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+57,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+57,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+57,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+57,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+57,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+56,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+56,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+56,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+56,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+56,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+55,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+55,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+55,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+55,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+55,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+54,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+54,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+54,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+54,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+54,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+53,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+53,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+53,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+53,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+53,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+52,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+52,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+52,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+52,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+52,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+51,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+51,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+51,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+51,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+51,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+50,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+50,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+50,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+50,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+50,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+49,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+49,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+49,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+49,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+49,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+48,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+48,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+48,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+48,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+48,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+47,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+47,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+47,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+47,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+47,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+46,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+46,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+46,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+46,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+46,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+45,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+45,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+45,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+45,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+45,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+44,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+44,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+44,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+44,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+44,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+43,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+43,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+43,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+43,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+43,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+42,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+42,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+42,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+42,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+42,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+41,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+41,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+41,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+41,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+41,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+40,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+40,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+40,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+40,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+40,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+39,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+39,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+39,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+39,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+39,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+38,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+38,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+38,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+38,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+38,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+37,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+37,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+37,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+37,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+37,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+36,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+36,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+36,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+36,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+36,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+35,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+35,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+35,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+35,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+35,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+34,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+34,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+34,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+34,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+34,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+33,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+33,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+33,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+33,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+33,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+32,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+32,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+32,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+32,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+32,x ; Update Right-most Tile Data. @sm16_2bp lda |RS1E_TILSRC_BASE+31,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+31,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+31,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+31,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+31,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+30,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+30,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+30,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+30,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+30,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+29,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+29,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+29,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+29,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+29,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+28,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+28,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+28,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+28,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+28,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+27,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+27,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+27,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+27,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+27,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+26,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+26,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+26,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+26,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+26,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+25,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+25,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+25,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+25,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+25,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+24,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+24,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+24,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+24,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+24,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+23,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+23,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+23,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+23,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+23,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+22,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+22,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+22,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+22,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+22,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+21,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+21,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+21,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+21,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+21,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+20,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+20,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+20,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+20,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+20,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+19,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+19,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+19,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+19,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+19,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+18,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+18,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+18,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+18,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+18,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+17,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+17,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+17,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+17,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+17,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+16,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+16,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+16,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+16,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+16,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+15,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+15,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+15,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+15,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+15,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+14,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+14,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+14,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+14,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+14,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+13,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+13,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+13,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+13,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+13,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+12,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+12,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+12,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+12,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+12,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+11,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+11,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+11,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+11,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+11,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+10,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+10,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+10,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+10,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+10,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+9,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+9,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+9,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+9,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+9,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+8,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+8,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+8,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+8,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+8,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+7,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+7,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+7,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+7,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+7,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+6,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+6,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+6,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+6,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+6,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+5,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+5,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+5,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+5,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+5,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+4,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+4,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+4,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+4,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+4,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+3,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+3,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+3,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+3,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+3,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+2,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+2,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+2,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+2,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+2,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+1,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+1,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+1,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+1,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+1,x ; Update Right-most Tile Data. lda |RS1E_TILSRC_BASE+0,y ; Load Accumulator with a bitrow of Source Tile. sta WRMPYB ; Store bitplane data in S-NES multiplicand Register. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+0,x ; Load Tile Buffer Data. ora RDMPYH ; Merge Left-most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+0,x ; Update Left-most Tile Data. ldx Rs1e.VWF.indxTilR ; Load index to right-most Tile in the buffer. lda >Rs1e.VWF.tilBuff+0,x ; Load Tile Buffer Data. ora RDMPYL ; Merge Right most tile with shifted bitrow. sta >Rs1e.VWF.tilBuff+0,x ; Update Right-most Tile Data. POPA ; Restore Assume List. rts ; Return. ENDIF ENDP TPlaceShiftMerge16 ; This following method will be for tiles exactly in position: ; to fix: see above. ; 'Merge'. TPlaceMerge8 PROC Near,MX:%10,D:RS1E_DPAGE,DB:^RS1E_KERNELDATA IF __VWF_INLINE=0 tay ; Pass Tile Source Address to Y sep #$20 ; Accum back to 8-bit. lsr Rs1e.VWF.rowCount ; Divide rowcount by 2 (proc' two at a time). ldx Rs1e.VWF.indxTilL ; Load X with Tile Buffer Index. @tp_loop lda |RS1E_TILSRC_BASE,y ; Fetch Source Tile bitrow. ora >Rs1e.VWF.tilBuff,x ; Merge bitrow with Existing Tile Buffer. sta >Rs1e.VWF.tilBuff,x ; Update Tile Buffer. lda |RS1E_TILSRC_BASE+1,y ; Fetch Source Tile bitrow. ora >Rs1e.VWF.tilBuff+1,x ; Merge bitrow with Existing Tile Buffer. sta >Rs1e.VWF.tilBuff+1,x ; Update Tile Buffer. inx inx iny iny dec Rs1e.VWF.rowCount ; Decrement Row Count. bne @tp_loop ; Loop back if not done for all. lda Rs1e.VWF.WidthShiftValue bne @skip_1 lda #$02 sta $3,s @skip_1 rts ; Return. ELSE PUSHA ; Push assume list. tax ; Pass Tile Source Addess to X. pea $2070 plb ASSUME DB:$70 ldy Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda Rs1e.VWF.tilDimType ; Load accum with tile dimension type. bne @m8_4bp brl @m8_2bp @m8_4bp lda >RS1E_TILSRC_BASE+62,x ; Fetch Source Tile bitrow. ora |Rs1e.VWF.tilBuff+62,y ; Merge bitrow with Existing Tile Buffer. sta |Rs1e.VWF.tilBuff+62,y ; Update Tile Buffer. lda >RS1E_TILSRC_BASE+60,x ; Fetch Source Tile bitrow. ora |Rs1e.VWF.tilBuff+60,y ; Merge bitrow with Existing Tile Buffer. sta |Rs1e.VWF.tilBuff+60,y ; Update Tile Buffer. lda >RS1E_TILSRC_BASE+58,x ; Fetch Source Tile bitrow. ora |Rs1e.VWF.tilBuff+58,y ; Merge bitrow with Existing Tile Buffer. sta |Rs1e.VWF.tilBuff+58,y ; Update Tile Buffer. lda >RS1E_TILSRC_BASE+56,x ; Fetch Source Tile bitrow. ora |Rs1e.VWF.tilBuff+56,y ; Merge bitrow with Existing Tile Buffer. sta |Rs1e.VWF.tilBuff+56,y ; Update Tile Buffer. lda >RS1E_TILSRC_BASE+54,x ; Fetch Source Tile bitrow. ora |Rs1e.VWF.tilBuff+54,y ; Merge bitrow with Existing Tile Buffer. sta |Rs1e.VWF.tilBuff+54,y ; Update Tile Buffer. lda >RS1E_TILSRC_BASE+52,x ; Fetch Source Tile bitrow. ora |Rs1e.VWF.tilBuff+52,y ; Merge bitrow with Existing Tile Buffer. sta |Rs1e.VWF.tilBuff+52,y ; Update Tile Buffer. lda >RS1E_TILSRC_BASE+50,x ; Fetch Source Tile bitrow. ora |Rs1e.VWF.tilBuff+50,y ; Merge bitrow with Existing Tile Buffer. sta |Rs1e.VWF.tilBuff+50,y ; Update Tile Buffer. lda >RS1E_TILSRC_BASE+48,x ; Fetch Source Tile bitrow. ora |Rs1e.VWF.tilBuff+48,y ; Merge bitrow with Existing Tile Buffer. sta |Rs1e.VWF.tilBuff+48,y ; Update Tile Buffer. lda >RS1E_TILSRC_BASE+46,x ; Fetch Source Tile bitrow. ora |Rs1e.VWF.tilBuff+46,y ; Merge bitrow with Existing Tile Buffer. sta |Rs1e.VWF.tilBuff+46,y ; Update Tile Buffer. lda >RS1E_TILSRC_BASE+44,x ; Fetch Source Tile bitrow. ora |Rs1e.VWF.tilBuff+44,y ; Merge bitrow with Existing Tile Buffer. sta |Rs1e.VWF.tilBuff+44,y ; Update Tile Buffer. lda >RS1E_TILSRC_BASE+42,x ; Fetch Source Tile bitrow. ora |Rs1e.VWF.tilBuff+42,y ; Merge bitrow with Existing Tile Buffer. sta |Rs1e.VWF.tilBuff+42,y ; Update Tile Buffer. lda >RS1E_TILSRC_BASE+40,x ; Fetch Source Tile bitrow. ora |Rs1e.VWF.tilBuff+40,y ; Merge bitrow with Existing Tile Buffer. sta |Rs1e.VWF.tilBuff+40,y ; Update Tile Buffer. lda >RS1E_TILSRC_BASE+38,x ; Fetch Source Tile bitrow. ora |Rs1e.VWF.tilBuff+38,y ; Merge bitrow with Existing Tile Buffer. sta |Rs1e.VWF.tilBuff+38,y ; Update Tile Buffer. lda >RS1E_TILSRC_BASE+36,x ; Fetch Source Tile bitrow. ora |Rs1e.VWF.tilBuff+36,y ; Merge bitrow with Existing Tile Buffer. sta |Rs1e.VWF.tilBuff+36,y ; Update Tile Buffer. lda >RS1E_TILSRC_BASE+34,x ; Fetch Source Tile bitrow. ora |Rs1e.VWF.tilBuff+34,y ; Merge bitrow with Existing Tile Buffer. sta |Rs1e.VWF.tilBuff+34,y ; Update Tile Buffer. lda >RS1E_TILSRC_BASE+32,x ; Fetch Source Tile bitrow. ora |Rs1e.VWF.tilBuff+32,y ; Merge bitrow with Existing Tile Buffer. sta |Rs1e.VWF.tilBuff+32,y ; Update Tile Buffer. @m8_2bp lda >RS1E_TILSRC_BASE+30,x ; Fetch Source Tile bitrow. ora |Rs1e.VWF.tilBuff+30,y ; Merge bitrow with Existing Tile Buffer. sta |Rs1e.VWF.tilBuff+30,y ; Update Tile Buffer. lda >RS1E_TILSRC_BASE+28,x ; Fetch Source Tile bitrow. ora |Rs1e.VWF.tilBuff+28,y ; Merge bitrow with Existing Tile Buffer. sta |Rs1e.VWF.tilBuff+28,y ; Update Tile Buffer. lda >RS1E_TILSRC_BASE+26,x ; Fetch Source Tile bitrow. ora |Rs1e.VWF.tilBuff+26,y ; Merge bitrow with Existing Tile Buffer. sta |Rs1e.VWF.tilBuff+26,y ; Update Tile Buffer. lda >RS1E_TILSRC_BASE+24,x ; Fetch Source Tile bitrow. ora |Rs1e.VWF.tilBuff+24,y ; Merge bitrow with Existing Tile Buffer. sta |Rs1e.VWF.tilBuff+24,y ; Update Tile Buffer. lda >RS1E_TILSRC_BASE+22,x ; Fetch Source Tile bitrow. ora |Rs1e.VWF.tilBuff+22,y ; Merge bitrow with Existing Tile Buffer. sta |Rs1e.VWF.tilBuff+22,y ; Update Tile Buffer. lda >RS1E_TILSRC_BASE+20,x ; Fetch Source Tile bitrow. ora |Rs1e.VWF.tilBuff+20,y ; Merge bitrow with Existing Tile Buffer. sta |Rs1e.VWF.tilBuff+20,y ; Update Tile Buffer. lda >RS1E_TILSRC_BASE+18,x ; Fetch Source Tile bitrow. ora |Rs1e.VWF.tilBuff+18,y ; Merge bitrow with Existing Tile Buffer. sta |Rs1e.VWF.tilBuff+18,y ; Update Tile Buffer. lda >RS1E_TILSRC_BASE+16,x ; Fetch Source Tile bitrow. ora |Rs1e.VWF.tilBuff+16,y ; Merge bitrow with Existing Tile Buffer. sta |Rs1e.VWF.tilBuff+16,y ; Update Tile Buffer. lda >RS1E_TILSRC_BASE+14,x ; Fetch Source Tile bitrow. ora |Rs1e.VWF.tilBuff+14,y ; Merge bitrow with Existing Tile Buffer. sta |Rs1e.VWF.tilBuff+14,y ; Update Tile Buffer. lda >RS1E_TILSRC_BASE+12,x ; Fetch Source Tile bitrow. ora |Rs1e.VWF.tilBuff+12,y ; Merge bitrow with Existing Tile Buffer. sta |Rs1e.VWF.tilBuff+12,y ; Update Tile Buffer. lda >RS1E_TILSRC_BASE+10,x ; Fetch Source Tile bitrow. ora |Rs1e.VWF.tilBuff+10,y ; Merge bitrow with Existing Tile Buffer. sta |Rs1e.VWF.tilBuff+10,y ; Update Tile Buffer. lda >RS1E_TILSRC_BASE+8,x ; Fetch Source Tile bitrow. ora |Rs1e.VWF.tilBuff+8,y ; Merge bitrow with Existing Tile Buffer. sta |Rs1e.VWF.tilBuff+8,y ; Update Tile Buffer. lda >RS1E_TILSRC_BASE+6,x ; Fetch Source Tile bitrow. ora |Rs1e.VWF.tilBuff+6,y ; Merge bitrow with Existing Tile Buffer. sta |Rs1e.VWF.tilBuff+6,y ; Update Tile Buffer. lda >RS1E_TILSRC_BASE+4,x ; Fetch Source Tile bitrow. ora |Rs1e.VWF.tilBuff+4,y ; Merge bitrow with Existing Tile Buffer. sta |Rs1e.VWF.tilBuff+4,y ; Update Tile Buffer. lda >RS1E_TILSRC_BASE+2,x ; Fetch Source Tile bitrow. ora |Rs1e.VWF.tilBuff+2,y ; Merge bitrow with Existing Tile Buffer. sta |Rs1e.VWF.tilBuff+2,y ; Update Tile Buffer. lda >RS1E_TILSRC_BASE+0,x ; Fetch Source Tile bitrow. ora |Rs1e.VWF.tilBuff+0,y ; Merge bitrow with Existing Tile Buffer. sta |Rs1e.VWF.tilBuff+0,y ; Update Tile Buffer. plb ; Restore RS1E Kernel Bank. POPA ; Restore Assume List. sep #$20 lda Rs1e.VWF.WidthShiftValue bne @skip_1 lda #$02 sta $3,s @skip_1 rts ; Return. ENDIF ENDP TPlaceMerge8 ; 'Shift+Store' ; This method is used for tiles when they are ; shifted to the 0pix position (8-bit shift ; range). TPlaceShiftStore8 PROC Near,MX:%00,D:RS1E_DPAGE,DB:^RS1E_KERNELDATA IF __VWF_INLINE=0 tay ; Pass Tile Source Address to Y sep #$20 ; Accum back to 8-bit. lsr Rs1e.VWF.rowCount ; Divide rowcount by 2 (proc' two at a time). ldx Rs1e.VWF.indxTilL ; Load X with Tile Buffer Index. @tss_loop lda |RS1E_TILSRC_BASE,y ; Load accum with a byte of tile data. sta WRMPYB ; Store bitplane data in S-NES mult' Reg. iny inx ; Placed here to fill hware latency. lda RDMPYL ; Fetch Shifted bitrow (8-bit range=4cyc latency). sta >Rs1e.VWF.tilBuff-1,x ; Store in the buffer (note: pre-adjusted X indx!). lda |RS1E_TILSRC_BASE,y ; Load accum with a byte of tile data. sta WRMPYB ; Store bitplane data in S-NES mult' Reg. iny inx ; Placed here to fill hware latency. lda RDMPYL ; Fetch Shifted bitrow (8-bit range=4cyc latency). sta >Rs1e.VWF.tilBuff-1,x ; Store in the buffer (note: pre-adjusted X indx!). dec Rs1e.VWF.rowCount ; Decrement our count. bne @tss_loop ; Loop back if not done for all. rts ; Return. ELSE PUSHA ; Push assume list. tay ; Pass Tile Source Addess to X. phd pea $4200 pld ASSUME D:$4200 sep #$20 ; Accum to 8-bit. ldx Rs1e.VWF.indxTilL ; Load index to left-most Tile in the buffer. lda Rs1e.VWF.tilDimType ; Load accum with tile dimension type. bne @ss8_4bp brl @ss8_2bp @ss8_4bp lda |RS1E_TILSRC_BASE+63,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+63,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+62,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+62,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+61,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+61,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+60,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+60,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+59,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+59,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+58,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+58,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+57,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+57,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+56,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+56,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+55,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+55,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+54,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+54,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+53,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+53,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+52,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+52,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+51,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+51,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+50,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+50,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+49,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+49,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+48,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+48,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+47,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+47,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+46,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+46,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+45,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+45,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+44,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+44,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+43,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+43,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+42,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+42,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+41,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+41,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+40,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+40,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+39,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+39,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+38,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+38,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+37,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+37,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+36,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+36,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+35,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+35,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+34,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+34,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+33,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+33,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+32,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+32,x ; Store in the buffer . @ss8_2bp lda |RS1E_TILSRC_BASE+31,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+31,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+30,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+30,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+29,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+29,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+28,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+28,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+27,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+27,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+26,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+26,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+25,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+25,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+24,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+24,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+23,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+23,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+22,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+22,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+21,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+21,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+20,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+20,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+19,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+19,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+18,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+18,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+17,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+17,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+16,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+16,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+15,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+15,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+14,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+14,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+13,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+13,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+12,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+12,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+11,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+11,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+10,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+10,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+9,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+9,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+8,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+8,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+7,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+7,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+6,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+6,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+5,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+5,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+4,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+4,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+3,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+3,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+2,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+2,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+1,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+1,x ; Store in the buffer . lda |RS1E_TILSRC_BASE+0,y ; Load accum with a byte of tile data. sta <WRMPYB ; Store bitplane data in S-NES mult' Reg. nop lda >RDMPYL ; Fetch Shifted bitrow . sta >Rs1e.VWF.tilBuff+0,x ; Store in the buffer . pld POPA ; Restore Assume List. rts ; Return. ENDIF ENDP TPlaceShiftStore8 ; This method is used for tiles when they are ; Zero shift tile, or fixed width. ; 'Store' TPlaceStore8 PROC Near,MX:%00,D:RS1E_DPAGE,DB:^RS1E_KERNELDATA tax ; Pass Tile Source Address to X lda Rs1e.VWF.indxTilL ; Load Y with low word Dest' Addr. adc #RS1E_VWF_TILBUFF_BASE & $ffff tay lda Rs1e.VWF.rowCount ; Load Number of bytes in a tile. dec a ; Adjust for Block Move count. phb mvn RS1E_SRC_BASE,Rs1e.VWF.tilBuff ; Block Move Neg'. plb sep #$20 ; Accum back to 8-bit. lda Rs1e.VWF.WidthShiftValue bne @tps8_noMapAdj lda #$02 sta $3,s @tps8_noMapAdj rts ; Return. ENDP TPlaceStore8 TPlaceWSpace8 PROC Near,MX:%00,D:RS1E_DPAGE,DB:^RS1E_KERNELDATA sep #$20 lda Rs1e.VWF.WidthShiftValue bne @ws8_1 lda #$02 sta $3,s @ws8_1 rts ENDP TPlaceWSpace8 TPlaceWSpace16 PROC Near,MX:%00,D:RS1E_DPAGE,DB:^RS1E_KERNELDATA rts ENDP TPlaceWSpace16 TPlaceWSpaceShift8 PROC Near,MX:%00,D:RS1E_DPAGE,DB:^RS1E_KERNELDATA rts ENDP TPlaceWSpaceShift8